package com.nineclock.system.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.nineclock.common.constant.NcConstant;
import com.nineclock.common.enums.ResponseEnum;
import com.nineclock.common.exception.NcException;
import com.nineclock.common.utils.BeanHelper;
import com.nineclock.system.dto.SysCompanyContactConfigDTO;
import com.nineclock.system.mapper.SysCompanyContactConfigMapper;
import com.nineclock.system.pojo.SysCompanyContactConfig;
import com.nineclock.system.service.SysCompanyContactConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * @Version 1.0
 */
@Service
@Slf4j
public class SysCompanyContactConfigServiceImpl implements SysCompanyContactConfigService {

    @Autowired
    SysCompanyContactConfigMapper companyContactConfigMapper;

    @Override
    public void addCompanyContactConfig(SysCompanyContactConfigDTO companyContactConfigDTO) {
        if(companyContactConfigDTO == null){
            throw new NcException(ResponseEnum.INVALID_PARAM_ERROR);
        }
        //把dto中的数据 复制到了 pojo中
        SysCompanyContactConfig companyContactConfig = BeanHelper.copyProperties(companyContactConfigDTO, SysCompanyContactConfig.class);

        //维护其他字段值
        companyContactConfig.setFieldType("string");
        companyContactConfig.setStatus((short)1);
        //设置企业的id， 先设置为 企业id 为 1， 后面的课程中会调整
        companyContactConfig.setCompanyId(1L);

        //新增到数据库
        companyContactConfigMapper.insert(companyContactConfig);
    }

    /**
     * 查询并初始化 企业通讯录字段
     *  如果系统管理员第一次登录访问， 初始化默认字段
     *  如果数据库中有企业通讯录字段， 直接查询并返回
     *
     *
     *  1. 查询当前企业的所有通讯录字段
     *  2. 如果查询为null（第一次登录访问），初始化默认字段
     *  3. 最后返回
     * @return
     */
    @Override
    public List<SysCompanyContactConfigDTO> queryCompanyContactConfig() {
        //假设企业id 为 1
        Long companyId = 1L;
        //1. 查询当前企业的所有通讯录字段
        LambdaQueryWrapper<SysCompanyContactConfig> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysCompanyContactConfig::getCompanyId , companyId);

        List<SysCompanyContactConfig> companyContactConfigList = companyContactConfigMapper.selectList(wrapper);

        //如果查询为null（第一次登录访问），
        if(CollectionUtil.isEmpty(companyContactConfigList)){
            //初始化默认字段
            for (String name : NcConstant.COMPANY_CONFIG_CONTACT_LIST) {
                //创建通讯录字段对象
                SysCompanyContactConfig companyContactConfig = new SysCompanyContactConfig();
                companyContactConfig.setCompanyId(companyId);
                companyContactConfig.setName(name);
                companyContactConfig.setFieldType("string");
                companyContactConfig.setType("fixed");
                companyContactConfig.setStatus((short)1);
                //添加通讯录字段
                companyContactConfigMapper.insert(companyContactConfig);
                //把通讯录字段添加到集合中
                companyContactConfigList.add(companyContactConfig);
            }
        }
        //转换为dto集合数据
        List<SysCompanyContactConfigDTO> companyContactConfigDTOS = BeanHelper.copyWithCollection(companyContactConfigList, SysCompanyContactConfigDTO.class);
        return companyContactConfigDTOS;
    }

    @Override
    public void updateCompanyContactConfig(Long id, Short status) {
        //判断参数是否为null
        if(id == null || status == null){
            //throw new RuntimeException(ResponseEnum.INVALID_PARAM_ERROR.getMessage());
            throw new NcException(ResponseEnum.INVALID_PARAM_ERROR);
        }
        //根据id查询， 如果查询不到，说明操作的数据不存在
        SysCompanyContactConfig companyContactConfig = companyContactConfigMapper.selectById(id);

        if(companyContactConfig == null){
            throw new NcException(ResponseEnum.DATA_NOT_EXISTS);
        }
        //更新状态
        companyContactConfig.setStatus(status);

        companyContactConfigMapper.updateById(companyContactConfig);

    }
}
